package org.cfd.controller;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import jakarta.annotation.Resource;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.cfd.entity.Products;
import org.cfd.service.ProductsService;
import org.cfd.utils.Code;
import org.cfd.utils.Result;
import org.springframework.web.bind.annotation.*;

/**
 * ProductsController类负责处理所有与产品有关的HTTP请求。 包括列表视图、获取单个产品、搜索产品、创建、更新、删除产品等各种功能。
 *
 * @author rjs
 */
@CrossOrigin
@RestController
@RequestMapping("/products")
public class ProductsController {

  @Resource private ProductsService productsService;

  /**
   * 获取包含分页信息的商品列表
   *
   * @param pageNum 页数，默认为0
   * @param pageSize 每页显示的商品数，默认为10
   * @return 包含状态和分页信息的Map
   */
  @GetMapping("/list")
  public Result list(
      @RequestParam(defaultValue = "0") int pageNum,
      @RequestParam(defaultValue = "10") int pageSize) {
    Page<Products> page = productsService.page(new Page<>(pageNum, pageSize));
    Map<String, Object> response = new HashMap<>();
    response.put("status", "success");
    response.put("data", page);
    return new Result(Code.SELECT_SUCCESS, "查询成功", response);
  }

  /**
   * 根据产品ID获取单个产品
   *
   * @param id 产品的ID
   * @return 包含状态和产品信息的Map，如果产品不存在，则返回错误信息
   */
  @GetMapping("/{id}")
  public Result get(@PathVariable Integer id) {
    Products product = productsService.getById(id);
    if (product == null) {
      return new Result(Code.SELECT_ERROR_ID, "查询失败，产品不存在", null);
    }
    return new Result(Code.SELECT_SUCCESS, "查询成功", product);
  }

  /**
   * 根据查询字符串查询产品名称或描述
   *
   * @param query 查询字符串
   * @return 包含状态和查询结果产品列表的Map
   */
  @GetMapping("/search")
  public Result search(@RequestParam String query) {
    List<Products> products = productsService.searchByNameOrDescription(query);
    return new Result(Code.SELECT_SUCCESS, "查询成功", products);
  }

  /**
   * 创建新的产品
   *
   * @param product 产品对象
   * @return 包含状态和新创建的产品信息的Map，如果新增失败，则返回错误信息
   */
  @PostMapping
  public Result create(@RequestBody Products product) {
    boolean isSaved = productsService.save(product);
    if (!isSaved) {
      return new Result(Code.ADD_ERROR, "新增失败", null);
    }
    return new Result(Code.ADD_SUCCESS, "新增成功", product);
  }

  /**
   * 更新指定的产品信息
   *
   * @param product 包含了要更新的产品信息的产品对象
   * @return 包含状态和更新后的产品信息的Map，如更新失败，则返回错误信息
   */
  @PutMapping
  public Result update(@RequestBody Products product) {
    product.setUpdatedAt(new Date());
    boolean isUpdated = productsService.updateById(product);
    if (!isUpdated) {
      return new Result(Code.UPDATE_ERROR, "更新失败", null);
    }
    return new Result(Code.UPDATE_SUCCESS, "更新成功", product);
  }

  /**
   * 根据产品ID删除产品
   *
   * @param id 要删除的产品的ID
   * @return 包含状态和操作信息的Map，如果删除失败，则返回错误信息
   */
  @DeleteMapping("/{id}")
  public Result delete(@PathVariable Integer id) {
    boolean isRemoved = productsService.removeById(id);
    if (!isRemoved) {
      return new Result(Code.DELETE_ERROR, "删除失败", null);
    }
    return new Result(Code.DELETE_SUCCESS, "删除成功", null);
  }

  /**
   * 获取所有产品信息
   *
   * @return 包含状态和产品列表信息的Map
   */
  @GetMapping("/all")
  public Result getAll() {
    List<Products> products = productsService.list();
    return new Result(Code.SELECT_SUCCESS, "查询成功", products);
  }

  /**
   * 获取轮播图商品，此处为获取所有商品中的前5个
   *
   * @return 包含状态和轮播图商品列表信息的Map
   */
  @GetMapping("/carousel")
  public Result getCarousel() {
    List<Products> carouselProducts = productsService.list().stream().limit(5).toList();
    return new Result(Code.SELECT_SUCCESS, "查询成功", carouselProducts);
  }

  /**
   * 获取所有商品分类
   *
   * @return 包含状态和商品分类信息的Map
   */
  @GetMapping("/categories")
  public Result getCategories() {
    List<String> categories = productsService.getAllCategories();
    return new Result(Code.SELECT_SUCCESS, "查询成功", categories);
  }

  /**
   * 根据商品分类获取商品
   *
   * @param category 商品分类
   * @return 包含状态和指定分类商品列表信息的Map
   */
  @GetMapping("/categories/{category}")
  public Result getProductsByCategory(@PathVariable String category) {
    List<Products> products = productsService.getProductsByCategory(category);
    return new Result(Code.SELECT_SUCCESS, "查询成功", products);
  }
}
